我們在昨天已經成功啟動了spring boot3,接下來我們就可以開發啦XD,但在打魔王前,我們總要先去各個商店購買武器、防具。今天就要來介紹我們的武器之一Domain modeling。
Domain,英文翻譯是領域,在這邊代表的意思就是Busniss domain,我們需要跟這個Domain的專家聊天、合作,一起討論出什麼是重要的核心觀念,
例如以滑鼠來說,對不熟悉的人來說,可能任何滑鼠都一樣,但對滑鼠專家來說,它會有左鍵、右鍵、中鍵,可能還有切換DPI的按鈕,以及側鍵等等,與Domain專家達到Share mental model(達成共識)就會是我們的第一目標,知己知彼百戰百勝XD
與專家們的溝通合作,就可以建立Ubiquitous Language(共通語言),才不會發生你不清楚我的明白。
例如說,現在有一個顏色在這邊。
有些人會說這是藍色!
有些人會說,不對!這是綠色!
這樣我們在認知上的不同,很有可能會造成開發上的災難,因此我們要避免這種情況發生,就要在我們的技術語言跟商業語言中,找出共同點。
從站在使用者的角度出發,我們更可以設計出瞄準解決使用者痛點的產品。
那麼除了Ubiquitous Language之外,我們也要注意我們系統的Contexts是什麼,以生活上來說,我們可能到M記速食店用餐,我們點了一個1號餐,接著我們晚上又去了K記速食店,點了一個1號餐,我們不會困惑為什麼兩間的1號餐不一樣,因為Bounded Contexts不同,同樣叫做1號餐,但會因為因為Bounded Contexts不同而有不同的意義。
好影片:https://www.youtube.com/watch?v=2JB1_e5wZmU&ab_channel=KanDDDinsky
那麼我們可以利用functional programing的一些好處,來讓我們的domain model好懂,好讀,讓不會寫程式的人一介紹就可以看得懂XD
今天就先來介紹Sum type 和 Product type吧(這邊利用F#的語法來介紹)
從它的名字來看,它就是+(or)的關係。
type A = B | C
現在有一個type A,它可能是由B或是C所組成的,那麼A的可能性有幾種呢?
假設B的可能性有3種,C的可能性也有三種,那麼A的可能性就是B+C,總共6種可能性。
同樣的,我們從它的名字來看,它是乘法(And)的關係。
type A = { B:B; C:C }
假設B的可能性有3種,C的可能性也有三種,那麼A的可能性就是B*C,總共9種可能性。並且如果缺少一個屬性,例如少了C,A這個type就不成立。
我們就可以利用Sum type以及Product type組合出我們想要的東西。
例如:1號餐的內容
type FirstCombo = { Hamburger:Hamburger; Fries:Fries }
type Hamburger = BeefHamburger | FishHamburger